import { PREVIEW } from "cc/env";

/**
 * 拓展JS的Math函数
 */
export default class MathExt {

    /**
     * 获取随机整数
     * @param value1 随机数边界
     * @param value2 另一个随机数边界（默认值为0）
     * @returns [value1,value2]区间内的整数
     */
    static int(value1: number, value2: number = 0): number {
        // 随机值差值
        const delta = value1 - value2;
        // 随机一个区间内差值整数
        const num = Math.round(Math.random() * delta) + value2;
        return Math.floor(num);
    }

    /**
     * 绝对值向上取整，并返回带符号的取整值
     * (获取数值整数部分已有函数Math.trunc，不需要额外拓展)
     * eg:
     * 1.11 => 2
     * -1.9 => -2
     * -1.2 => -2
     * @param v 
     */
    static ceilTrunc(v: number): number {
        return v >= 0 ? Math.ceil(v) : Math.floor(v);
    }

    /**
     * 获取数值带符号的小数部分
     * eg:
     * 3.75 => 0.75
     * -3.78 => -0.78
     * @param v 
     * @returns 
     */
    static fract(v: number): number {
        return v - Math.trunc(v);
    }

    /**
     * 将数值切割成数组存储
     * @param number (number | "-" | ".")[]
     * @returns 
     */
    static split(number: number): (number | "-" | ".")[] {
        let ary: (number | "-" | ".")[] = [];
        number
            .toString()
            .split("")
            .forEach((e: string) => {
                ary.push(e === "-" || e === "." ? e : parseInt(e));
            });
        return ary;
    }

    /**
     * 计算数值最高有效位是十的几次方 
     * @param v
     */
    static getPow(v: number): number {
        if (v == 0)
            return 0;

        v = Math.abs(v);
        const arr: (number | "-" | ".")[] = MathExt.split(v);

        // 找到首个非0、非符号位的位置
        const first = arr.findIndex((a: number | "-" | ".") => {
            return a !== "-" && a !== "." && a !== 0;
        });
        // 小数点的位置
        let dotIndex = arr.indexOf(".");
        if (dotIndex < 0)
            dotIndex = arr.length;

        let pow = dotIndex - first;
        if (v >= 1)
            pow -= 1;
        return pow;
    }

}
if (PREVIEW)
    globalThis.MathExt = MathExt;
